/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package pe.com.cotelasa.helper;

import java.awt.print.PrinterException;
import java.text.DateFormat;
import java.text.DecimalFormat;
import java.text.DecimalFormatSymbols;
import java.text.NumberFormat;
import java.util.Collection;
import java.util.List;
import java.util.Locale;
import pe.com.cotelasa.common.printer.PrinterService;
import pe.com.cotelasa.common.printer.PrinterUtility;
import pe.com.cotelasa.scp.dominio.common.Constantes;
import pe.com.cotelasa.scp.dominio.common.util.UtilitarioCadenas;
import pe.com.cotelasa.scp.dominio.common.util.UtilitarioFecha;
import pe.com.cotelasa.scp.entidad.Cliente;
import pe.com.cotelasa.scp.entidad.DetalleGuiaRemision;
import pe.com.cotelasa.scp.entidad.Empresa;
import pe.com.cotelasa.scp.entidad.GuiaRemision;
import pe.com.cotelasa.scp.entidad.Proveedor;
import pe.com.cotelasa.scp.entidad.VentaDetalleFacturacion;
import pe.com.cotelasa.scp.entidad.VentaDetalleNotaCredito;
import pe.com.cotelasa.scp.entidad.VentaDetalleNotaDebito;
import pe.com.cotelasa.scp.entidad.VentaFacturacion;
import pe.com.cotelasa.scp.entidad.VentaNotaCredito;
import pe.com.cotelasa.scp.entidad.VentaNotaDebito;

/**
 *
 * @author Jorge
 */
public class VentaFacturacionPrintHelper {

    public static void imprimirFacturaVenta(VentaFacturacion facturacion, String formaPago, List<VentaDetalleFacturacion> lista, String impresora)
            throws PrinterException {

        DecimalFormatSymbols decimalFormatSymbols = new DecimalFormatSymbols();
        decimalFormatSymbols.setDecimalSeparator('.');
        decimalFormatSymbols.setGroupingSeparator(',');
        DecimalFormat df = new DecimalFormat("#,##0.00", decimalFormatSymbols);

        StringBuilder sbLinea = new StringBuilder();
        //PrinterService print = new PrinterService(36,"\\\\192.168.1.40\\HPF2400", false);
        PrinterService print = new PrinterService(36, impresora, false);
        //PrinterService print = new PrinterService(36,"C:\\FACTURA.txt", false);
        if (!print.startPrintService()) {
            throw new PrinterException("Error en Impresora. Verifique !!!");
        }
        print.activateCondensed();
        print.printBlankLine(9);// Avanzo 2 lineas

        // INICIO Fechas 
        // INICIO cabeceras 
        sbLinea = new StringBuilder("");
        sbLinea.append(PrinterUtility.espaciosBlanco(8));
        sbLinea.append(UtilitarioFecha.formatearFecha(facturacion.getFechDocventa(), "dd"));
        sbLinea.append(PrinterUtility.espaciosBlanco(6));
        sbLinea.append(UtilitarioFecha.formatearFecha(facturacion.getFechDocventa(), "MMMM").toUpperCase());
        sbLinea.append(PrinterUtility.espaciosBlanco(17));
        sbLinea.append(UtilitarioFecha.formatearFecha(facturacion.getFechDocventa(), "yy"));
        print.printLine(sbLinea.toString(), true);
        print.printBlankLine(1);
        // FIN Fechas


        sbLinea = new StringBuilder("");
        sbLinea.append(PrinterUtility.espaciosBlanco(12));
        sbLinea.append(facturacion.getRazon());
        print.printLine(sbLinea.toString(), true);
        print.printBlankLine(1);




        String direccion = facturacion.getDireccion();
        int lineaMax = 2;
        do {
            sbLinea = new StringBuilder();
            int posPartida = 0;

            if (lineaMax > 0) {

                //34 espacios hasta terminar partida 
                posPartida = (direccion.length() >= 80) ? 80 : direccion.length();
                sbLinea.append(PrinterUtility.espaciosBlanco(20));
                if (posPartida > 0) {
                    sbLinea.append(direccion.substring(0, posPartida));
                }

                direccion = direccion.substring(posPartida, direccion.length());

                if (lineaMax == 2) {
                    print.printLine(sbLinea.toString(), false);
                    sbLinea = new StringBuilder("");

                    if (posPartida == 80) {
                        sbLinea.append(PrinterUtility.espaciosBlanco(20));
                    } else {
                        sbLinea.append(PrinterUtility.espaciosBlanco(90 - posPartida));
                    }

                    sbLinea.append(facturacion.getRuc());
                    print.printLine(sbLinea.toString(), true);
                } else {
                    print.printLine(sbLinea.toString(), true);

                }
            }
            lineaMax--;
        } while (direccion.length() > 0);


        sbLinea = new StringBuilder("");
        sbLinea.append(PrinterUtility.espaciosBlanco(20));
        sbLinea.append(formaPago);
        print.printLine(sbLinea.toString(), false);

        sbLinea = new StringBuilder("");
        sbLinea.append(PrinterUtility.espaciosBlanco(32 - formaPago.length()));
        sbLinea.append(facturacion.getnOcliente());
        print.printLine(sbLinea.toString(), false);

        sbLinea = new StringBuilder("");
        sbLinea.append(PrinterUtility.espaciosBlanco(55 - facturacion.getnOcliente().length()));
        sbLinea.append(facturacion.getGuiaRem());
        print.printLine(sbLinea.toString(), true);
        print.printBlankLine(3);

        int lineaTotales = 0;
        if (!lista.isEmpty()) {
            for (VentaDetalleFacturacion detalle : lista) {

                boolean first = true;


                String producto = detalle.getUnidad().getAbrev() + " " + detalle.getDescProducto();
                String auxiliar = "";
                lineaMax = 30 - lineaTotales;
                do {


                    int posPartida = 0;

                    if (lineaMax > 0) {

                        //34 espacios hasta terminar partida 
                        posPartida = (producto.length() >= 100) ? 100 : producto.length();
                        if (first) {
                            sbLinea = new StringBuilder();
                            sbLinea.append(PrinterUtility.espaciosBlanco(2));
                            sbLinea.append(df.format(detalle.getCantidad()));
                            print.printLine(sbLinea.toString(), false);

                            sbLinea = new StringBuilder();
                            sbLinea.append(PrinterUtility.espaciosBlanco(8 - detalle.getCantidad().toString().length()));
                        } else {
                            sbLinea = new StringBuilder();
                            sbLinea.append(PrinterUtility.espaciosBlanco(12));
                        }

                        if (posPartida > 0) {
                            sbLinea.append(producto.substring(0, posPartida));
                            if (first) {
                                auxiliar = producto.substring(0, posPartida);
                            }
                        }

                        producto = producto.substring(posPartida, producto.length());

                        if (first) {

                            print.printLine(sbLinea.toString(), false);

                            sbLinea = new StringBuilder();
                            sbLinea.append(PrinterUtility.espaciosBlanco(89 - auxiliar.length()));
                            sbLinea.append(facturacion.getMoneda().getSimbolo()).append(" ").append(df.format(detalle.getPrecUnitario()));
                            print.printLine(sbLinea.toString(), false);


                            sbLinea = new StringBuilder();
                            sbLinea.append(PrinterUtility.espaciosBlanco(13 - detalle.getPrecUnitario().toString().length()));
                            sbLinea.append(facturacion.getMoneda().getSimbolo()).append(" ").append(df.format(detalle.getTotal()));
                            print.printLine(sbLinea.toString(), true);
                        } else {
                            print.printLine(sbLinea.toString(), true);
                            first = false;
                        }



                    }
                    lineaMax--;
                } while (producto.length() > 0);



                lineaTotales++;
            }

        }

        print.printBlankLine(38 - lineaTotales);

        sbLinea = new StringBuilder("");
        sbLinea.append(PrinterUtility.espaciosBlanco(5));
        sbLinea.append("SON:").append(facturacion.getValorLetras());
        print.printLine(sbLinea.toString(), true);

        print.printBlankLine(1);

        sbLinea = new StringBuilder("");
        sbLinea.append(PrinterUtility.espaciosBlanco(114));
        sbLinea.append(facturacion.getMoneda().getSimbolo()).append(" ").append(df.format(facturacion.getValorVenta()));
        print.printLine(sbLinea.toString(), true);

        print.printBlankLine(1);

        sbLinea = new StringBuilder("");
        sbLinea.append(PrinterUtility.espaciosBlanco(114));
        sbLinea.append(facturacion.getMoneda().getSimbolo()).append(" ").append(df.format(facturacion.getIgv()));
        print.printLine(sbLinea.toString(), true);

        print.printBlankLine(1);

        sbLinea = new StringBuilder("");
        sbLinea.append(PrinterUtility.espaciosBlanco(114));
        sbLinea.append(facturacion.getMoneda().getSimbolo()).append(" ").append(df.format(facturacion.getPrecioVenta()));
        print.printLine(sbLinea.toString(), false);



        print.endPrintService();
    }

    public static void imprimirBoletaVenta(VentaFacturacion facturacion, List<VentaDetalleFacturacion> lista, String impresora)
            throws PrinterException {


        DecimalFormatSymbols decimalFormatSymbols = new DecimalFormatSymbols();
        decimalFormatSymbols.setDecimalSeparator('.');
        decimalFormatSymbols.setGroupingSeparator(',');
        DecimalFormat df = new DecimalFormat("#,##0.00", decimalFormatSymbols);


        StringBuilder sbLinea = new StringBuilder();
        //PrinterService print = new PrinterService(36,"\\\\192.168.1.40\\HPF2400", false);
        PrinterService print = new PrinterService(36, impresora, false);
        //PrinterService print = new PrinterService(36,"C:\\FACTURA.txt", false);
        if (!print.startPrintService()) {
            throw new PrinterException("Error en Impresora. Verifique !!!");
        }
        print.activateCondensed();
        print.printBlankLine(10);// Avanzo 2 lineas



        sbLinea = new StringBuilder("");
        sbLinea.append(PrinterUtility.espaciosBlanco(15));
        sbLinea.append(facturacion.getRazon());

        sbLinea.append(PrinterUtility.espaciosBlanco(78 - facturacion.getRazon().length()));
        sbLinea.append(UtilitarioFecha.formatearFecha(facturacion.getFechDocventa(), "dd"));
        sbLinea.append(PrinterUtility.espaciosBlanco(6));
        sbLinea.append(UtilitarioFecha.formatearFecha(facturacion.getFechDocventa(), "MMMM").toUpperCase());
        sbLinea.append(PrinterUtility.espaciosBlanco(17));
        sbLinea.append(UtilitarioFecha.formatearFecha(facturacion.getFechDocventa(), "yy"));
        print.printLine(sbLinea.toString(), true);

        print.printBlankLine(1);




        String direccion = facturacion.getDireccion();
        int lineaMax = 2;
        do {
            sbLinea = new StringBuilder();
            int posPartida = 0;

            if (lineaMax > 0) {

                //34 espacios hasta terminar partida 
                posPartida = (direccion.length() >= 80) ? 80 : direccion.length();
                sbLinea.append(PrinterUtility.espaciosBlanco(20));
                if (posPartida > 0) {
                    sbLinea.append(direccion.substring(0, posPartida));
                }

                direccion = direccion.substring(posPartida, direccion.length());

                if (lineaMax == 2) {
                    print.printLine(sbLinea.toString(), false);
                    sbLinea = new StringBuilder("");

                    if (posPartida == 80) {
                        sbLinea.append(PrinterUtility.espaciosBlanco(20));
                    } else {
                        sbLinea.append(PrinterUtility.espaciosBlanco(90 - posPartida));
                    }

                    sbLinea.append(facturacion.getRuc());
                    print.printLine(sbLinea.toString(), true);
                } else {
                    print.printLine(sbLinea.toString(), true);

                }
            }
            lineaMax--;
        } while (direccion.length() > 0);


        print.printBlankLine(3);

        int lineaTotales = 0;
        if (!lista.isEmpty()) {
            for (VentaDetalleFacturacion detalle : lista) {

                boolean first = true;


                String producto = detalle.getUnidad().getAbrev() + " " + detalle.getDescProducto();
                String auxiliar = "";
                lineaMax = 13 - lineaTotales;
                do {


                    int posPartida = 0;

                    if (lineaMax > 0) {

                        //34 espacios hasta terminar partida 
                        posPartida = (producto.length() >= 100) ? 100 : producto.length();
                        if (first) {
                            sbLinea = new StringBuilder();
                            sbLinea.append(PrinterUtility.espaciosBlanco(5));
                            sbLinea.append(df.format(detalle.getCantidad()));
                            print.printLine(sbLinea.toString(), false);

                            sbLinea = new StringBuilder();
                            sbLinea.append(PrinterUtility.espaciosBlanco(7 - detalle.getCantidad().toString().length()));
                        } else {
                            sbLinea = new StringBuilder();
                            sbLinea.append(PrinterUtility.espaciosBlanco(12));
                        }

                        if (posPartida > 0) {
                            sbLinea.append(producto.substring(0, posPartida));
                            if (first) {
                                auxiliar = producto.substring(0, posPartida);
                            }
                        }

                        producto = producto.substring(posPartida, producto.length());

                        if (first) {

                            print.printLine(sbLinea.toString(), false);

                            sbLinea = new StringBuilder();
                            sbLinea.append(PrinterUtility.espaciosBlanco(86 - auxiliar.length()));
                            sbLinea.append(facturacion.getMoneda().getSimbolo()).append(" ").append(df.format(detalle.getPrecUnitario()));
                            print.printLine(sbLinea.toString(), false);


                            sbLinea = new StringBuilder();
                            sbLinea.append(PrinterUtility.espaciosBlanco(15 - detalle.getPrecUnitario().toString().length()));
                            sbLinea.append(facturacion.getMoneda().getSimbolo()).append(" ").append(df.format(detalle.getTotal()));
                            print.printLine(sbLinea.toString(), true);
                        } else {
                            print.printLine(sbLinea.toString(), true);
                            first = false;
                        }



                    }
                    lineaMax--;
                } while (producto.length() > 0);



                lineaTotales++;
            }

        }

        print.printBlankLine(13 - lineaTotales);



        print.printBlankLine(2);

        sbLinea = new StringBuilder("");
        sbLinea.append(PrinterUtility.espaciosBlanco(116));
        sbLinea.append(facturacion.getMoneda().getSimbolo()).append(" ").append(df.format(facturacion.getPrecioVenta()));
        print.printLine(sbLinea.toString(), false);

        print.printBlankLineSinSalto(1);

        sbLinea = new StringBuilder("");
        sbLinea.append(PrinterUtility.espaciosBlanco(50));
        sbLinea.append(UtilitarioFecha.formatearFecha(facturacion.getFechDocventa(), "dd"));
        sbLinea.append(PrinterUtility.espaciosBlanco(14));
        sbLinea.append(UtilitarioFecha.formatearFecha(facturacion.getFechDocventa(), "MMMM").toUpperCase());
        sbLinea.append(PrinterUtility.espaciosBlanco(17));
        sbLinea.append(UtilitarioFecha.formatearFecha(facturacion.getFechDocventa(), "yy"));
        print.printLine(sbLinea.toString(), true);


        print.endPrintService();
    }

    public static void imprimirGuiaRemision(VentaFacturacion facturacion, List<VentaDetalleFacturacion> lista, String impresora)
            throws PrinterException {

        DecimalFormatSymbols decimalFormatSymbols = new DecimalFormatSymbols();
        decimalFormatSymbols.setDecimalSeparator('.');
        decimalFormatSymbols.setGroupingSeparator(',');
        DecimalFormat df = new DecimalFormat("#,##0.00", decimalFormatSymbols);

        StringBuilder sbLinea = new StringBuilder();

        //PrinterService print = new PrinterService(36,"\\\\192.168.1.40\\FX890", false);
        PrinterService print = new PrinterService(36, impresora, false);
        System.out.println("por aca esta");
        if (!print.startPrintService()) {
            System.out.println("no se pudoooooooooooooo");
            throw new PrinterException("Error en Impresora. Verifique !!!");

        }
        print.activateCondensed();
        print.printBlankLine(8);// Avanzo 8 lineas
        // INICIO Fechas 
        sbLinea = new StringBuilder("");
        sbLinea.append(PrinterUtility.espaciosBlanco(17));
        sbLinea.append(UtilitarioFecha.formatearFecha(facturacion.getFechDocventa(), "dd/MM/yyyy"));
        sbLinea.append(PrinterUtility.espaciosBlanco(35));
        sbLinea.append(UtilitarioFecha.formatearFecha(facturacion.getFechEntrega(), "dd/MM/yyyy"));
        print.printLine(sbLinea.toString(), true);
        print.printBlankLine(2);
        // FIN Fechas

        String dirPartida = facturacion.getDomiPartida();
        String dirLlegada = facturacion.getDomiLlegada();
        int lineaMax = 3;
        do {
            sbLinea = new StringBuilder();
            int posLLegada = 0;
            int posPartida = 0;

            if (lineaMax == 0) {
                break; // Solo acepta 5 lineas como maximo
            }
            //34 espacios hasta terminar partida 
            posPartida = (dirPartida.length() >= 50) ? 50 : dirPartida.length();
            if (posPartida > 0) {
                sbLinea.append(PrinterUtility.espaciosBlanco(3));
                sbLinea.append(dirPartida.substring(0, posPartida));
                sbLinea.append(PrinterUtility.espaciosBlanco(65 - dirPartida.length()));
            } else {
                sbLinea.append(PrinterUtility.espaciosBlanco(65 - dirPartida.length()));
            }

            posLLegada = (dirLlegada.length() >= 50) ? 50 : dirLlegada.length();
            if (posLLegada > 0) {
                sbLinea.append(dirLlegada.substring(0, posLLegada));
            }

            lineaMax--;
            dirPartida = dirPartida.substring(posPartida, dirPartida.length());
            dirLlegada = dirLlegada.substring(posLLegada, dirLlegada.length());
            print.printLine(sbLinea.toString(), true);
        } while (dirPartida.length() > 0 && dirLlegada.length() > 0);
        // FIN Dir. LLegada / Partida

        print.printBlankLine(6 - lineaMax);



        sbLinea = new StringBuilder("");
        sbLinea.append(PrinterUtility.espaciosBlanco(85));
        sbLinea.append(facturacion.getMarcaEt());

        print.printLine(sbLinea.toString(), true);

        print.printBlankLine(1);

        sbLinea = new StringBuilder("");
        sbLinea.append(PrinterUtility.espaciosBlanco(3));
        sbLinea.append(facturacion.getRazon());

        sbLinea.append(PrinterUtility.espaciosBlanco(75 - facturacion.getRazon().length()));
        sbLinea.append(facturacion.getMnplacaEt());

        sbLinea.append(PrinterUtility.espaciosBlanco(42 - facturacion.getMnplacaEt().length()));
        sbLinea.append(facturacion.getNcinsEt());

        print.printLine(sbLinea.toString(), true);


        sbLinea = new StringBuilder("");
        sbLinea.append(PrinterUtility.espaciosBlanco(8));
        sbLinea.append(facturacion.getRuc());

        sbLinea.append(PrinterUtility.espaciosBlanco(75));
        sbLinea.append(facturacion.getNlicenciaEt());

        print.printLine(sbLinea.toString(), true);



        sbLinea = new StringBuilder("");
        sbLinea.append(PrinterUtility.espaciosBlanco(8));
        sbLinea.append(facturacion.getDireccion().substring(0, 50));

        sbLinea.append(PrinterUtility.espaciosBlanco(110 - facturacion.getDireccion().length()));
        sbLinea.append(df.format(facturacion.getCostoMinimo()));
        print.printLine(sbLinea.toString(), true);


        print.printBlankLine(3);


        int lineaTotales = 0;
        if (!lista.isEmpty()) {
            for (VentaDetalleFacturacion detalle : lista) {

                boolean first = true;


                String producto = detalle.getDescProducto();
                String auxiliar = "";
                lineaMax = 35 - lineaTotales;
                do {


                    int posPartida = 0;

                    if (lineaMax > 0) {

                        //34 espacios hasta terminar partida 
                        posPartida = (producto.length() >= 85) ? 85 : producto.length();

                        sbLinea = new StringBuilder();
                        sbLinea.append(PrinterUtility.espaciosBlanco(3));


                        if (posPartida > 0) {
                            sbLinea.append(producto.substring(0, posPartida));
                            if (first) {
                                auxiliar = producto.substring(0, posPartida);
                            }
                        }

                        producto = producto.substring(posPartida, producto.length());

                        if (first) {

                            print.printLine(sbLinea.toString(), false);

                            sbLinea = new StringBuilder();
                            sbLinea.append(PrinterUtility.espaciosBlanco(90 - auxiliar.length()));
                            sbLinea.append(df.format(detalle.getCantidadEmpaque()) + " " + detalle.getEmpaque());
                            print.printLine(sbLinea.toString(), false);


                            sbLinea = new StringBuilder();
                            sbLinea.append(PrinterUtility.espaciosBlanco(15 - detalle.getCantidad().toString().length()));
                            sbLinea.append(detalle.getUnidad().getAbrev());

                            sbLinea.append(PrinterUtility.espaciosBlanco(12 - detalle.getUnidad().getAbrev().length()));
                            sbLinea.append(df.format(detalle.getCantidad()));

                            print.printLine(sbLinea.toString(), true);
                        } else {
                            print.printLine(sbLinea.toString(), true);
                            first = false;
                        }



                    }
                    lineaMax--;
                } while (producto.length() > 0);



                lineaTotales++;
            }

        }

        print.printBlankLine(31 - lineaTotales);

        sbLinea = new StringBuilder("");
        sbLinea.append(PrinterUtility.espaciosBlanco(8));
        sbLinea.append(facturacion.getRazonEt());
        print.printLine(sbLinea.toString(), true);

        sbLinea = new StringBuilder("");
        sbLinea.append(PrinterUtility.espaciosBlanco(8));
        sbLinea.append(facturacion.getRazonEt());
        print.printLine(sbLinea.toString(), true);

        print.endPrintService();
    }

    public static void imprimirNotaCredito(VentaNotaCredito notacredito, List<VentaDetalleNotaCredito> listaDetalle, String impresora)
            throws PrinterException {

        DecimalFormatSymbols decimalFormatSymbols = new DecimalFormatSymbols();
        decimalFormatSymbols.setDecimalSeparator('.');
        decimalFormatSymbols.setGroupingSeparator(',');
        DecimalFormat df = new DecimalFormat("#,##0.00", decimalFormatSymbols);

        StringBuilder sbLinea = new StringBuilder();
        PrinterService print = new PrinterService(36, impresora, false);
        // PrinterService print = new PrinterService(36,"C:\\GUIA.txt", false);
        if (!print.startPrintService()) {
            throw new PrinterException("Error en Impresora. Verifique !!!");
        }
        print.activateCondensed();
        print.printBlankLine(9);// Avanzo 6 lineas


        sbLinea.append(PrinterUtility.espaciosBlanco(17));
        sbLinea.append(notacredito.getEmpresa());
        print.printLine(sbLinea.toString(), true);

        print.printBlankLineSinSalto(1);

        sbLinea = new StringBuilder();
        sbLinea.append(PrinterUtility.espaciosBlanco(90));
        sbLinea.append(notacredito.getDocumentoMod());
        sbLinea.append(PrinterUtility.espaciosBlanco(10));
        sbLinea.append(notacredito.getNumeroMod());
        print.printLine(sbLinea.toString(), true);

        sbLinea = new StringBuilder();
        sbLinea.append(PrinterUtility.espaciosBlanco(17));
        sbLinea.append(notacredito.getRuc());
        print.printLine(sbLinea.toString(), true);

        print.printBlankLine(1);

        sbLinea = new StringBuilder();
        sbLinea.append(PrinterUtility.espaciosBlanco(25));
        sbLinea.append(UtilitarioFecha.formatearFecha(notacredito.getFechanc(), "dd"));
        sbLinea.append(PrinterUtility.espaciosBlanco(10));
        sbLinea.append(UtilitarioFecha.formatearFecha(notacredito.getFechanc(), "MM"));
        sbLinea.append(PrinterUtility.espaciosBlanco(10));
        sbLinea.append(UtilitarioFecha.formatearFecha(notacredito.getFechanc(), "yyyy"));


        DateFormat df3 = DateFormat.getDateInstance(DateFormat.LONG);
        sbLinea.append(PrinterUtility.espaciosBlanco(40));
        sbLinea.append(df3.format(notacredito.getFechaMod()).toUpperCase());
        print.printLine(sbLinea.toString(), true);


        print.printBlankLine(3);

        int lineaTotales = 0;
        if (!listaDetalle.isEmpty()) {
            for (VentaDetalleNotaCredito detalle : listaDetalle) {

                boolean first = true;


                String producto = detalle.getDescripcion();
                String auxiliar = "";
                int lineaMax = 8 - lineaTotales;
                do {


                    int posPartida = 0;

                    if (lineaMax > 0) {

                        //34 espacios hasta terminar partida 
                        posPartida = (producto.length() >= 60) ? 60 : producto.length();
                        if (first) {
                            sbLinea = new StringBuilder();
                            sbLinea.append(PrinterUtility.espaciosBlanco(5));
                            sbLinea.append(df.format(detalle.getCantidad()));
                            print.printLine(sbLinea.toString(), false);

                            sbLinea = new StringBuilder();
                            sbLinea.append(PrinterUtility.espaciosBlanco(10 - detalle.getCantidad().toString().length()));
                        } else {
                            sbLinea = new StringBuilder();
                            sbLinea.append(PrinterUtility.espaciosBlanco(12));
                        }

                        if (posPartida > 0) {
                            sbLinea.append(producto.substring(0, posPartida));
                            if (first) {
                                auxiliar = producto.substring(0, posPartida);
                            }
                        }

                        producto = producto.substring(posPartida, producto.length());

                        if (first) {

                            print.printLine(sbLinea.toString(), false);

                            sbLinea = new StringBuilder();
                            sbLinea.append(PrinterUtility.espaciosBlanco(84 - auxiliar.length()));
                            sbLinea.append(notacredito.getMoneda().getSimbolo()).append(" ").append(df.format(detalle.getPrecioUni()));
                            print.printLine(sbLinea.toString(), false);


                            sbLinea = new StringBuilder();
                            sbLinea.append(PrinterUtility.espaciosBlanco(11 - detalle.getPrecioUni().toString().length()));
                            sbLinea.append(notacredito.getMoneda().getSimbolo()).append(" ").append(df.format(detalle.getImporte()));
                            print.printLine(sbLinea.toString(), true);
                        } else {
                            print.printLine(sbLinea.toString(), true);
                            first = false;
                        }



                    }
                    lineaMax--;
                } while (producto.length() > 0);



                lineaTotales++;
            }

        }

        print.printBlankLine(9 - lineaTotales);

        sbLinea = new StringBuilder("");
        sbLinea.append(PrinterUtility.espaciosBlanco(116));
        sbLinea.append(notacredito.getMoneda().getSimbolo()).append(" ").append(df.format(notacredito.getImporte()));
        print.printLine(sbLinea.toString(), true);

        print.printBlankLine(1);

        sbLinea = new StringBuilder("");
        sbLinea.append(PrinterUtility.espaciosBlanco(116));
        sbLinea.append(notacredito.getMoneda().getSimbolo()).append(" ").append(df.format(notacredito.getIgv()));
        print.printLine(sbLinea.toString(), true);


        print.printBlankLine(1);


        sbLinea = new StringBuilder("");
        sbLinea.append(PrinterUtility.espaciosBlanco(116));
        sbLinea.append(notacredito.getMoneda().getSimbolo()).append(" ").append(df.format(notacredito.getTotal()));
        print.printLine(sbLinea.toString(), true);

        print.endPrintService();
    }

    public static void imprimirNotaDebito(VentaNotaDebito notadebito, List<VentaDetalleNotaDebito> listaDetalle, String impresora)
            throws PrinterException {
        DecimalFormatSymbols decimalFormatSymbols = new DecimalFormatSymbols();
        decimalFormatSymbols.setDecimalSeparator('.');
        decimalFormatSymbols.setGroupingSeparator(',');
        DecimalFormat df = new DecimalFormat("#,##0.00", decimalFormatSymbols);

        StringBuilder sbLinea = new StringBuilder();
        PrinterService print = new PrinterService(36, impresora, false);
        // PrinterService print = new PrinterService(36,"C:\\GUIA.txt", false);
        if (!print.startPrintService()) {
            throw new PrinterException("Error en Impresora. Verifique !!!");
        }
        print.activateCondensed();
        print.printBlankLine(9);// Avanzo 6 lineas


        sbLinea = new StringBuilder();
        sbLinea.append(PrinterUtility.espaciosBlanco(8));
        sbLinea.append(UtilitarioFecha.formatearFecha(notadebito.getFechand(), "dd"));
        sbLinea.append(PrinterUtility.espaciosBlanco(8));
        sbLinea.append(UtilitarioFecha.formatearFecha(notadebito.getFechand(), "MMMM").toUpperCase());
        sbLinea.append(PrinterUtility.espaciosBlanco(20));
        sbLinea.append(UtilitarioFecha.formatearFecha(notadebito.getFechand(), "yyyy"));
        print.printLine(sbLinea.toString(), true);

        print.printBlankLine(1);

        sbLinea = new StringBuilder();
        sbLinea.append(PrinterUtility.espaciosBlanco(15));
        sbLinea.append(notadebito.getEmpresa());
        sbLinea.append(PrinterUtility.espaciosBlanco(95 - notadebito.getEmpresa().length()));
        sbLinea.append(notadebito.getRuc());
        print.printLine(sbLinea.toString(), true);

        //print.printBlankLine(1);

        sbLinea = new StringBuilder();
        sbLinea.append(PrinterUtility.espaciosBlanco(15));
        sbLinea.append(notadebito.getDireccion());
        sbLinea.append("");
        print.printLine(sbLinea.toString(), true);

        print.printBlankLine(4);

        int lineaTotales = 0;
        if (!listaDetalle.isEmpty()) {
            for (VentaDetalleNotaDebito detalle : listaDetalle) {

                boolean first = true;


                String producto = detalle.getDescripcion();
                String auxiliar = "";
                int lineaMax = 8 - lineaTotales;
                do {


                    int posPartida = 0;

                    if (lineaMax > 0) {

                        //34 espacios hasta terminar partida 
                        posPartida = (producto.length() >= 80) ? 80 : producto.length();
                        if (first) {
                            sbLinea = new StringBuilder();
                            sbLinea.append(PrinterUtility.espaciosBlanco(5));
                            sbLinea.append("");
                            print.printLine(sbLinea.toString(), false);

                            sbLinea = new StringBuilder();
                            sbLinea.append(PrinterUtility.espaciosBlanco(5));
                        } else {
                            sbLinea = new StringBuilder();
                            sbLinea.append(PrinterUtility.espaciosBlanco(12));
                        }

                        if (posPartida > 0) {
                            sbLinea.append(producto.substring(0, posPartida));
                            if (first) {
                                auxiliar = producto.substring(0, posPartida);
                            }
                        }

                        producto = producto.substring(posPartida, producto.length());

                        if (first) {

                            print.printLine(sbLinea.toString(), false);

                            sbLinea = new StringBuilder();
                            sbLinea.append(PrinterUtility.espaciosBlanco(105 - auxiliar.length()));
                            sbLinea.append(notadebito.getMoneda().getSimbolo()).append(" ").append(df.format(detalle.getImporte()));
                            print.printLine(sbLinea.toString(), false);


                            sbLinea = new StringBuilder();
                            //sbLinea.append(PrinterUtility.espaciosBlanco(11-detalle.getPrecioUni().toString().length()));
                            //sbLinea.append(notacredito.getMoneda().getSimbolo()).append(" ").append(df.format(detalle.getImporte()));
                            print.printLine(sbLinea.toString(), true);
                        } else {
                            print.printLine(sbLinea.toString(), true);
                            first = false;
                        }



                    }
                    lineaMax--;
                } while (producto.length() > 0);



                lineaTotales++;
            }

        }

        print.printBlankLine(10 - lineaTotales);

        sbLinea = new StringBuilder("");
        sbLinea.append(PrinterUtility.espaciosBlanco(5));
        sbLinea.append("SON:").append(notadebito.getTotalletras()).append(notadebito.getMoneda().getNombre());
        print.printLine(sbLinea.toString(), true);

        print.printBlankLine(1);

        sbLinea = new StringBuilder("");
        sbLinea.append(PrinterUtility.espaciosBlanco(116));
        sbLinea.append(notadebito.getMoneda().getSimbolo()).append(" ").append(df.format(notadebito.getImporte()));
        print.printLine(sbLinea.toString(), true);

        print.printBlankLine(1);

        sbLinea = new StringBuilder("");
        sbLinea.append(PrinterUtility.espaciosBlanco(116));
        sbLinea.append(notadebito.getMoneda().getSimbolo()).append(" ").append(df.format(notadebito.getIgv()));
        print.printLine(sbLinea.toString(), true);


        sbLinea = new StringBuilder("");
        sbLinea.append(PrinterUtility.espaciosBlanco(116));
        sbLinea.append(notadebito.getMoneda().getSimbolo()).append(" ").append(df.format(notadebito.getTotal()));
        print.printLine(sbLinea.toString(), true);

        print.endPrintService();
    }

    public static void imprimirFacturaExportacion(VentaFacturacion facturacion, String codigoOP, Collection<VentaDetalleFacturacion> lista, String impresora)
            throws PrinterException {

        DecimalFormatSymbols decimalFormatSymbols = new DecimalFormatSymbols();
        decimalFormatSymbols.setDecimalSeparator('.');
        decimalFormatSymbols.setGroupingSeparator(',');
        DecimalFormat df = new DecimalFormat("#,##0.00", decimalFormatSymbols);

        StringBuilder sbLinea = new StringBuilder();
        //PrinterService print = new PrinterService(36,"\\\\192.168.1.40\\HPF2400", false);
        PrinterService print = new PrinterService(36, impresora, false);
        //PrinterService print = new PrinterService(36,"C:\\FACTURA.txt", false);
        if (!print.startPrintService()) {
            throw new PrinterException("Error en Impresora. Verifique !!!");
        }
        print.activateCondensed();
        print.printBlankLine(9);// Avanzo 2 lineas

        // INICIO Fechas 
        // INICIO cabeceras 
        sbLinea = new StringBuilder("");
        sbLinea.append(PrinterUtility.espaciosBlanco(8));
        sbLinea.append(UtilitarioFecha.formatearFecha(facturacion.getFechDocventa(), "dd DE MMMM DEL yyyy"));
        print.printLine(sbLinea.toString(), true);
        print.printBlankLine(4);
        // FIN Fechas


        /*sbLinea = new StringBuilder("");
         sbLinea.append(PrinterUtility.espaciosBlanco(6));
         sbLinea.append(facturacion.getRazon());
         print.printLine(sbLinea.toString(), true);
         print.printBlankLine(1);*/



        String razonSocial = facturacion.getRazon();
        String direccion = facturacion.getDireccion();
        int lineaMax = 4;
        String aux = "";
        while (lineaMax > 0) {
            sbLinea = new StringBuilder();
            //25 espacios hasta terminar partida 
            aux = UtilitarioCadenas.extraerSubcadenaExacta(razonSocial, 25);
            sbLinea.append(PrinterUtility.espaciosBlanco(6));
            sbLinea.append(aux);
            razonSocial = razonSocial.substring(aux.length(), razonSocial.length());

            sbLinea.append(PrinterUtility.espaciosBlanco(32 - aux.length()));
            aux = UtilitarioCadenas.extraerSubcadenaExacta(direccion, 40);

            sbLinea.append(aux);
            direccion = direccion.substring(aux.length(), direccion.length());

            if (lineaMax == 3) {
                sbLinea.append(PrinterUtility.espaciosBlanco(48 - aux.length()));
                sbLinea.append(codigoOP);
            } 
             print.printLine(sbLinea.toString(), true);
            lineaMax--;
        }
        print.printBlankLine(2);
        
        sbLinea = new StringBuilder("");
        sbLinea.append(PrinterUtility.espaciosBlanco(38));
        sbLinea.append(facturacion.getTipoPago());

        sbLinea.append(PrinterUtility.espaciosBlanco(55 - facturacion.getTipoPago().length()));
        sbLinea.append(facturacion.getNumBultos());
        print.printLine(sbLinea.toString(), true);
        
        print.printBlankLine(5);
        
        sbLinea = new StringBuilder("");
        sbLinea.append(PrinterUtility.espaciosBlanco(6));
        sbLinea.append(facturacion.getPuertoOrigen());

        sbLinea.append(PrinterUtility.espaciosBlanco(38 - facturacion.getPuertoOrigen().length()));
        sbLinea.append(facturacion.getEmbarcado());

        sbLinea.append(PrinterUtility.espaciosBlanco(45 - facturacion.getEmbarcado().length()));
        sbLinea.append(facturacion.getPuertoDestino());
        print.printLine(sbLinea.toString(), true);
        
        
        print.printBlankLine(3);
        
       
        int lineaTotales = 0;
        if (!lista.isEmpty()) {
            for (VentaDetalleFacturacion detalle : lista) {

                boolean first = true;


                String producto = detalle.getUnidad().getAbrev() + " " + detalle.getDescProducto();
                String auxiliar = "";
                lineaMax = 30 - lineaTotales;
                do {


                    int posPartida = 0;

                    if (lineaMax > 0) {

                        //34 espacios hasta terminar partida 
                        posPartida = (producto.length() >= 100) ? 100 : producto.length();
                        if (first) {
                            sbLinea = new StringBuilder();
                            sbLinea.append(PrinterUtility.espaciosBlanco(2));
                            sbLinea.append(df.format(detalle.getCantidad()));
                            print.printLine(sbLinea.toString(), false);

                            sbLinea = new StringBuilder();
                            sbLinea.append(PrinterUtility.espaciosBlanco(8 - detalle.getCantidad().toString().length()));
                        } else {
                            sbLinea = new StringBuilder();
                            sbLinea.append(PrinterUtility.espaciosBlanco(12));
                        }

                        if (posPartida > 0) {
                            sbLinea.append(producto.substring(0, posPartida));
                            if (first) {
                                auxiliar = producto.substring(0, posPartida);
                            }
                        }

                        producto = producto.substring(posPartida, producto.length());

                        if (first) {

                            print.printLine(sbLinea.toString(), false);

                            sbLinea = new StringBuilder();
                            sbLinea.append(PrinterUtility.espaciosBlanco(89 - auxiliar.length()));
                            sbLinea.append(facturacion.getMoneda().getSimbolo()).append(" ").append(df.format(detalle.getPrecUnitario()));
                            print.printLine(sbLinea.toString(), false);


                            sbLinea = new StringBuilder();
                            sbLinea.append(PrinterUtility.espaciosBlanco(13 - detalle.getPrecUnitario().toString().length()));
                            sbLinea.append(facturacion.getMoneda().getSimbolo()).append(" ").append(df.format(detalle.getTotal()));
                            print.printLine(sbLinea.toString(), true);
                        } else {
                            print.printLine(sbLinea.toString(), true);
                            first = false;
                        }



                    }
                    lineaMax--;
                } while (producto.length() > 0);



                lineaTotales++;
            }

        }

        print.printBlankLine(38 - lineaTotales);

        sbLinea = new StringBuilder("");
        sbLinea.append(PrinterUtility.espaciosBlanco(5));
        sbLinea.append("SON:").append(facturacion.getValorLetras());
        print.printLine(sbLinea.toString(), true);

        print.printBlankLine(1);

        sbLinea = new StringBuilder("");
        sbLinea.append(PrinterUtility.espaciosBlanco(114));
        sbLinea.append(facturacion.getMoneda().getSimbolo()).append(" ").append(df.format(facturacion.getValorVenta()));
        print.printLine(sbLinea.toString(), true);

        print.printBlankLine(1);

        sbLinea = new StringBuilder("");
        sbLinea.append(PrinterUtility.espaciosBlanco(114));
        sbLinea.append(facturacion.getMoneda().getSimbolo()).append(" ").append(df.format(facturacion.getIgv()));
        print.printLine(sbLinea.toString(), true);

        print.printBlankLine(1);

        sbLinea = new StringBuilder("");
        sbLinea.append(PrinterUtility.espaciosBlanco(114));
        sbLinea.append(facturacion.getMoneda().getSimbolo()).append(" ").append(df.format(facturacion.getPrecioVenta()));
        print.printLine(sbLinea.toString(), false);



        print.endPrintService();
    }

    public static boolean verificarImpresora(String impresora) {

        PrinterService print = new PrinterService(36, impresora, false);

        if (!print.startPrintService()) {
            return false;
        } else {
            return true;
        }

    }
}
